package IO流.释放资源的方式;

public class Test {
    public static void main(String[] args) {
        // 为什么close()方法不安全: 因为如果在执行close语句前出现问题, 则没有机会执行close语句, 这样就导致资源浪费

        // 1.方法一: try-catch-finally
        // 特点: finally代码区的特点, 无论try中的程序是正常执行了, 还是出现异常, 最后都一定会指向finally区, 除非jvm终止
        // 作用: 一般用于在程序执行完成后进行资源的释放操作(专业级做法)
        try {
            //System.out.println(10 / 2);
            System.out.println(10 / 0); //出问题, 但是也会执行finally区的代码
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally执行了");
        }

    }

    // 注意事项
    public static int chu(int a, int b) {
        try {
            return a / b;
        } catch (Exception o) {
            o.printStackTrace();
            return -1;
        } finally {
            // 千万不要在finally中返回数据!!!
            // 如果在finally区里返回数据就会有问题: 每次返回的都是finally区返回的数据, 因为在try区里要执行return语句时, 会停下来先执行finally区的return, 则try区的return没机会执行

        }

        // 方法二: try-with-resource
        // 解决方法一的臃肿,
        // 格式
//        try (定义资源1; 定义资源2;...) {
//            可能出现异常的代码;
//        } catch (异常类名 变量名) {
//            异常处理代码
//        }

        // 该定义资源使用完毕后, 会自动调用其close()方法, 完成对资源的释放!
        // 注意: 定义资源只能放置资源对象(流对象)
        // 资源: 资源一般指的时最终实现AutoCloseable接口

    }
}
